home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Ham Radio 2000
/
Ham Radio 2000.iso
/
ham2000
/
satellit
/
pbsv004
/
pbdir.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-05
|
7KB
|
316 lines
/* pbdir.c 1993.8.6 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <search.h>
/* #include <io.h> */
#include <time.h>
/* #include <dos.h> */
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "pbsv.h"
extern VOID add_kss(char*,int),add_crc(); /* pbsv.c */
extern char *dlname(long);
extern VOID initq(),putq(); /* pblib.c */
extern struct stqcell *getq();
extern VOID ca2ad(),ad2ca();
extern int ckcrc();
extern int calc_crc(); /* crc.c */
extern VOID sndkss(); /* pbkiss.c */
extern BOOL f_rkss,f_skss; /* pbsv.c */
extern int lnrkss,lnskss;
extern char rkss[],skss[];
extern struct stqueue actuser;
extern struct stqueue freeuser;
extern struct stqueue freehole;
extern char hdrdqst[];
extern char dldir[];
extern BOOL f_verbose;
struct stpfhdir pfhdir[MAXPFHDIR];
int npfhdir;
/*
* < initdir > initialize directory entory
*/
int initdir()
{
int compare();
VOID dispdir();
int pfhstat(char*,struct stpfh *);
char path[128],pathname[128];
typedef struct find_t buffer;
struct stat sbuf;
struct stpfh pfh;
int i,r;
long file_id;
sprintf(path,"%s*.DL",dldir);
printf("Making PFHDIR... %s\n",path);
for (i = 0; i < MAXPFHDIR ;) {
if (i == 0) {
r = _dos_findfirst(path,_A_NORMAL,&buffer);
} else {
r = _dos_findnext(&buffer);
}
if (r != 0)
break;
sscanf(buffer.name,"%lx.DL",&file_id);
strcpy(pathname,dlname(file_id));
stat(pathname,&sbuf);
r = pfhstat(pathname,&pfh);
printf("\r%d %s",i+1,pathname);
if (r == 0) {
pfhdir[i].t_new = sbuf.st_mtime;
pfhdir[i].file_id = file_id;
pfhdir[i].pfh_size = pfh.pfh_size;
i++;
} else {
printf("...PFH Error!!!\n");
}
}
npfhdir = i;
printf("\n");
qsort(&pfhdir[0],npfhdir, sizeof(struct stpfhdir),compare);
pfhdir[0].t_old = 0;
for (i = 1; i < npfhdir; i++) {
pfhdir[i].t_old = pfhdir[i-1].t_new + 1;
}
if (f_verbose) {
dispdir();
}
return(npfhdir);
}
int compare(d1,d2)
struct stpfhdir *d1,*d2;
{
if (d1->t_new == d2->t_new) {
return(0);
} else if ((u_long)d1->t_new > (u_long)d2->t_new) {
return(1);
} else {
return(-1);
}
}
/*
* < dispdir > display directory
*/
VOID dispdir()
{
int i;
for (i = 0; i < npfhdir; i++) {
printf(" %4d %lu,%lu %lX %d\n", i,
pfhdir[i].t_old,pfhdir[i].t_new,pfhdir[i].file_id,
pfhdir[i].pfh_size);
}
}
/*
* < qst_dir > directory
*/
VOID qst_dir(user)
struct stuser *user;
{
u_char send_pfh();
struct sthole *hole;
u_char flags;
int i,j,dirent;
for (i = 0; i < 5; i++) {
hole = (struct sthole *)user->hole.head;
if (hole == NULL)
break;
printf("Dir Start: %ld, End: %lu\n",hole->start,hole->end);
dirent = npfhdir-1;
for (j = 0; j < npfhdir; j++) {
if ((u_long)hole->start >= (u_long)pfhdir[j].t_old &&
(u_long)hole->start <= (u_long)pfhdir[j].t_new) {
dirent = j;
break;
}
}
flags = send_pfh(dirent,user->block_size);
hole->start = pfhdir[dirent].t_new + 1;
if ((u_long)hole->start > (u_long)hole->end ||
(flags & 0x40)) { /* hole delete ? */
hole = (struct sthole *)getq(&user->hole);
putq(&freehole,hole);
}
}
}
/*
* < send_pfh > send PFH
*/
u_char send_pfh(dirent,block_size)
int dirent;
int block_size;
{
FILE *fp;
char buf[256];
u_char flags;
int size;
long file_id,offset;
file_id = pfhdir[dirent].file_id;
if ((fp = fopen(dlname(file_id),"rb")) == NULL) {
assert(0);
}
flags = 0x00;
if ((dirent+1) == npfhdir) /* newest file ? */
flags |= 0x40;
offset = 0;
for (;;) {
size = pfhdir[dirent].pfh_size - offset;
if (size <= block_size) {
flags |= 0x20; /* last byte of frame */
} else {
size = block_size;
}
printf("QST-1: dir %02x %lx offset=%lu,length=%d\n",
flags,file_id,offset,size);
#define SEEK_SET 0
fseek(fp,offset,SEEK_SET);
fread(buf,size,1,fp);
lnskss = 0;
add_kss(hdrdqst,HDRSIZE);
add_kss(&flags,1);
add_kss((char*)&file_id,4);
add_kss((char*)&offset,4);
add_kss((char*)&pfhdir[dirent].t_old,4);
add_kss((char*)&pfhdir[dirent].t_new,4);
add_kss(buf,size);
add_crc();
sndkss();
if (flags & 0x20) {
break;
}
offset += size;
}
fclose(fp);
return(flags);
}
/*
* < req_dir > request directory
*/
int req_dir(callsign)
char *callsign;
{
u_char flags;
u_int block_size;
struct stuser *user;
struct sthole *hole;
time_t start,end;
int i;
i = HDRSIZE;
flags = rkss[i];
i += 1;
memcpy(&block_size,&rkss[i],2);
i += 2;
user = (struct stuser *)getq(&freeuser);
if (user == NULL) {
return(-1); /* queue full */
}
user->entry_t = clock();
user->flags = F_DIR;
strcpy(user->call,callsign);
user->block_size = block_size;
initq(&user->hole);
putq(&actuser,user);
printf("%s: Directory request %02x %d\n",callsign,flags,block_size);
for ( ; i < lnrkss; i += (4+4)) {
memcpy(&start,&rkss[i],4);
memcpy(&end, &rkss[i+4],4);
hole = (struct sthole *)getq(&freehole);
if (hole == NULL)
break;
hole->start = start;
hole->end = end;
putq(&user->hole,hole);
printf(" %lu,%lu\n",start,end);
}
return(0); /* OK */
}
/*
* < pfhstat > PFH stat
*/
int pfhstat(name,pfh)
char name[];
struct stpfh *pfh;
{
FILE *fp;
int c,i,s,length;
char data[256];
u_int id;
s = 0;
if ((fp = fopen(name,"rb")) == NULL) {
return(-1);
}
c = fgetc(fp);
s++;
id = (c<<8);
c = fgetc(fp);
s++;
id |= c;
if (id != 0xaa55) { /* PFH check ? */
fclose(fp);
return(-1);
}
for (;;) {
c = fgetc(fp);
if (c == EOF)
break;
id = c;
c = fgetc(fp);
id |= (c<<8);
c = fgetc(fp);
length = c;
s += 3;
if (id == 0 && length == 0) /* termination ? */
break;
for (i = 0; i < length; i++) {
data[i] = fgetc(fp);
s++;
}
switch(id) {
case 0x04:
memcpy(&pfh->file_size,data,4);
break;
case 0x08:
pfh->file_type = data[0];
break;
case 0x0b:
memcpy(&pfh->body_offset,data,2);
break;
default:
break;
}
}
fclose(fp);
pfh->pfh_size = s;
return(0);
}
/* pbdir.c */